<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一：
        // function sum(a, b) {
        //     // return a + b     // 12
        //     return a * b     // 2
        // }

        // console.log(sum(1, '2'))  
        // JavaScript 是一种动态类型语言：我们不指定某些变量的类型。值可以在你不知道的情况下自动转换成另一种类型，
        // 这种类型称为隐式类型转换（implicit type coercion）。Coercion 是指将一种类型转换为另一种类型。

        // 二：
        // function getPersonInfo(one, two, three) {
        //     console.log(one)
        //     console.log(two)
        //     console.log(three)
        // }

        // const person = 'Lydia'
        // const age = 21

        // getPersonInfo`${person} is ${age} years old` 
        // ["", " is ", " years old"] "Lydia" 21
        // 如果使用标记模板字面量，第一个参数的值总是包含字符串的数组。其余的参数获取的是传递的表达式的值！

        // 三：
        // function checkAge(data) {
        // if (data === { age: 18 }) {
        //     console.log('You are an adult!')
        // } else if (data == { age: 18 }) {
        //     console.log('You are still an adult.')
        // } else {
        //     console.log('Hmm.. You don\'t have an age I guess')
        // }
        // }

        // checkAge({ age: 18 })
        // // Hmm.. You don't have an age I guess
        // // 在测试相等性时，基本类型通过它们的值（value）进行比较，而对象通过它们的引用（reference）进行比较。JavaScript 检查对象是否具有对内存中相同位置的引用。
        // // 题目中我们正在比较的两个对象不是同一个引用：作为参数传递的对象引用的内存位置，与用于判断相等的对象所引用的内存位置并不同。

        // // 四：
        // function getAge(...args) {
        //     console.log(typeof args)
        // }

        // getAge(21)  // object
        // 扩展运算符（...args）会返回实参组成的数组。而数组是对象，因此 typeof args 返回 "object"。

        // 五：
        var a = 10;
        var a = 20;
        console.log(a)  // 20 覆盖

        let b = 10;
        // let b = 20;
        console.log(b)  // 报错，在同域中不能有2个相同的名字出现（也包括形参）

        let c = 20;
        c  = 30;
        console.log(c)

        const d = 20;
        // d = 30;
        console.log(d)  // 报错，不可变的量,一变就报错，

        // const e;     // 声明之后必须赋值,不赋值就报错

        // 六：
        const obj = { 1: 'a', 2: 'b', 3: 'c' }
        const set = new Set([1, 2, 3, 4, 5])

        obj.hasOwnProperty('1')
        obj.hasOwnProperty(1)
        set.has('1')
        set.has(1)

        // true true false true
        // 所有对象的键（不包括 Symbol）在底层都是字符串，即使你自己没有将其作为字符串输入。这就是为什么 obj.hasOwnProperty('1') 也返回 true。
        // 对于集合，它不是这样工作的。在我们的集合中没有 '1'：set.has('1') 返回 false。它有数字类型为 1，set.has(1) 返回 true。
    </script>
</body>
</html>